home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Format CD 52
/
Amiga Format AFCD52 (Issue 136, May 2000).iso
/
-serious-
/
programming
/
other
/
dopus412-gpl
/
library
/
menus.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-02-28
|
4KB
|
170 lines
/*
Directory Opus 4
Original GPL release version 4.12
Copyright 1993-2000 Jonathan Potter
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
All users of Directory Opus 4 (including versions distributed
under the GPL) are entitled to upgrade to the latest version of
Directory Opus version 5 at a reduced price. Please see
http://www.gpsoft.com.au for more information.
The release of Directory Opus 4 under the GPL in NO WAY affects
the existing commercial status of Directory Opus 5.
*/
#include "dopuslib.h"
__asm __saveds DoFSSetMenuStrip(register __a0 struct Window *window,
register __a1 struct Menu *firstmenu)
{
struct Menu *menu;
struct MenuItem *item;
struct DrawInfo *drinfo;
int fpen,bpen;
int y,offset,xpos=0,iwidth,comwidth,checkwidth;
struct IntuiText testtext;
struct TextAttr testattr;
comwidth=COMMWIDTH;
checkwidth=CHECKWIDTH;
AskFont(&window->WScreen->RastPort,&testattr);
testtext.FrontPen=1;
testtext.DrawMode=JAM1;
testtext.NextText=NULL;
if (IntuitionBase->LibNode.lib_Version>36 &&
(drinfo=GetScreenDrawInfo(window->WScreen))) {
if (IntuitionBase->LibNode.lib_Version>=39) {
fpen=drinfo->dri_Pens[BARDETAILPEN];
bpen=drinfo->dri_Pens[BARBLOCKPEN];
if (drinfo->dri_AmigaKey) comwidth=drinfo->dri_AmigaKey->Width;
if (drinfo->dri_CheckMark) checkwidth=drinfo->dri_CheckMark->Width;
}
else {
fpen=drinfo->dri_Pens[DETAILPEN];
bpen=drinfo->dri_Pens[BLOCKPEN];
}
FreeScreenDrawInfo(window->WScreen,drinfo);
}
else {
fpen=0;
bpen=1;
}
offset=window->WScreen->Font->ta_YSize+3;
menu=firstmenu;
while (menu) {
if (xpos==0) xpos=menu->LeftEdge;
else menu->LeftEdge=xpos;
menu->Width=
TextLength(&window->WScreen->RastPort,menu->MenuName,strlen(menu->MenuName))+
window->WScreen->RastPort.Font->tf_XSize;
xpos+=menu->Width+16;
y=0;
iwidth=0;
item=menu->FirstItem;
while (item) {
item->TopEdge=y;
if (item->Flags&ITEMTEXT) {
struct IntuiText *text;
int wid,mwidth=0,first=0;
item->Height=offset-1;
text=(struct IntuiText *)item->ItemFill;
while (text) {
text->FrontPen=fpen;
text->BackPen=bpen;
if (first==0) {
if (strncmp(text->IText," ",3)==0) text->IText=&text->IText[3];
if (item->Flags&CHECKIT) text->LeftEdge=checkwidth;
else text->LeftEdge=0;
}
if (text->ITextFont) testtext.ITextFont=text->ITextFont;
else testtext.ITextFont=&testattr;
testtext.IText=text->IText;
wid=text->LeftEdge+IntuiTextLength(&testtext)+window->WScreen->RastPort.Font->tf_XSize;
if (wid>mwidth) mwidth=wid;
if (text=text->NextText) {
y+=offset;
text->TopEdge=offset+3;
}
++first;
}
if (item->Flags&COMMSEQ)
mwidth+=comwidth+TextLength(&window->WScreen->RastPort,&item->Command,1);
if (mwidth>iwidth) iwidth=mwidth;
y+=offset;
}
else {
struct Image *image;
int wid;
++item->TopEdge;
image=(struct Image *)item->ItemFill;
while (image) {
if (image->ImageData==NULL) {
image->Height=2;
image->PlaneOnOff=fpen;
}
else {
wid=image->LeftEdge+image->Width;
if (wid>iwidth) iwidth=wid;
}
y+=image->TopEdge+image->Height;
image=image->NextImage;
}
y+=3;
}
item=item->NextItem;
}
item=menu->FirstItem;
while (item) {
item->Width=iwidth;
if (!(item->Flags&ITEMTEXT)) {
struct Image *image;
image=(struct Image *)item->ItemFill;
while (image) {
if (image->ImageData==NULL) image->Width=iwidth;
image=image->NextImage;
}
}
item=item->NextItem;
}
menu=menu->NextMenu;
}
return((int)SetMenuStrip(window,firstmenu));
}